import {createI18n} from "vue-i18n";
import en from "./en.json";
import zhHans from "./zh-Hans.json";

// 国际化接口
interface Messages
{
    [key: string]: any;
}

// 语言包
export const messages: Messages = {
    en,
    "zh-Hans": zhHans
};

// 创建国际化
const i18n = createI18n({
    legacy: false, // 确保使用 Composition API 模式
    locale: uni.getLocale(),
    fallbackLocale: "zh-Hans",
    globalInjection: false, // 全局注入 $t 函数
    messages
});

// 初始化语言
const initLocale = (): void =>
{
    const savedLocale = getStorage("language") || uni.getLocale();

    // 有些代码在语言切换前执行，需要提前初始化语言。对于页面模板模式
    if (savedLocale)
    {
        // 使用系统默认初始化语言
        i18n.global.locale.value = savedLocale;
    }
};

// 任意文件使用$t翻译方法，需要在app里全局导入
export const translate = (localeKey: string, params: {[key: string]: string} = {}): string =>
{
    // 确保 localeKey 不为空
    if (!localeKey)
    {
        error(`[i18n] Function translate(), localeKey param is required`);

        return localeKey;
    }

    // 获取本地语言
    const locale = i18n.global.locale.value;

    // 获取当前语言
    const message = messages[locale];

    // 如果找不到语言，则返回默认值
    if (!message)
    {
        error(`[i18n] Locale "${locale}" not found.`);

        return localeKey;
    }

    // 将键路径解析为数组
    const keys: string[] = localeKey.split(".");

    // 递归获取值
    function getValue(message: any, path: string[]): string | undefined
    {
        if (path.length === 0)
        {
            return message;
        }

        const [first, ...rest] = path;

        return getValue(message[first], rest);
    }

    // 递归查找对应的值
    const value = getValue(message, keys);

    if (typeof value !== "string")
    {
        warn(`[i18n] Translation key "${localeKey}" not found in locale "${locale}".`);

        return localeKey; // 或者返回默认值
    }

    // 进行字符串替换
    return value.replace(/{(\w+)}/g, (match, key) => params[key] || match);
};

// 安装到全局，覆盖不能正常工作的$t
const installGlobal = (): void =>
{
    (function(global)
    {
        (global as any).$t = translate;

    })(this || window || globalThis);
};

// 获取当前语言
export const getLocale = () => i18n.global.locale.value;

// 设置当前语言
export const setLocale = (locale: string) =>
{
    i18n.global.locale.value = locale;

    // 保存到本地
    setStorage("language", locale);
};

// 初始化语言
initLocale();

// 安装到全局，覆盖不能正常工作的$t
installGlobal();

export default i18n;